package fr.charlott.business.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.commons.lang.StringUtils;

import fr.charlott.business.dto.AdresseDTO;
import fr.charlott.business.dto.CategorieDTO;
import fr.charlott.business.dto.ClienteDTO;
import fr.charlott.business.dto.HotesseDTO;
import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.dto.ReunionDTO;
import fr.charlott.core.repository.model.Collection;
import fr.charlott.core.repository.model.TailleBas;
import fr.charlott.core.repository.model.TailleHaut;

public class ImportCSVHelper {
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

	// Colonnes clientes/hotesses
	private static final int perNom = 0;
	private static final int perPrenom = 1;
	private static final int per_ADR_rue = 2;
	private static final int per_ADR_cp = 3;
	private static final int per_ADR_ville = 4;
	private static final int per_ADR_telDom = 5;
	private static final int per_ADR_telPort = 6;
	private static final int per_ADR_email = 7;
	private static final int perDateNaissance = 8;
	private static final int perTailleHaut = 9;
	private static final int perTailleBas = 10;
	private static final int perDerniereVisite = 11;
	private static final int perCommentaires = 12;
	private static final int perPreferences = 13;
	private static final int perAchats = 14;
	private static final int perProduits = 15;
	
	// Colonnes clientes
	private static final int cliIndividuelle = 16;
	private static final int cliHotesse = 17;
	
	// Colonnes reunion
	private static final int reuDate = 0;
	private static final int reuHotesse = 1;
	private static final int reuCA = 2;
	
	// Colonnes produits
	private static final int proNom = 0;
	private static final int proReference = 1;
	private static final int proCategorie = 2;
	private static final int proPrix = 3;
	private static final int proCollection = 4;
	private static final int proSaison = 5;
	
	// Colonne catgorie
	private static final int categNom = 0;
	
	private static String hotesse;
	
	private static String produits;
	
	private static int saison;
	
	private static String categorie;
	
	public static ClienteDTO readLine(String line) throws ParseException {
		//Supresion des quotes
		line = line.replaceAll("\"","" );
		//Split de la ligne
		String[] strings = line.split(";", -1);
		//Suppression des espaces en debut et fin de chaines
		strings = trim(strings);
		
		AdresseDTO adresse = new AdresseDTO();
		ClienteDTO cliente = new ClienteDTO(adresse);

		// Nom
		cliente.setNom(strings[perNom].toUpperCase());
		// Prenom
		cliente.setPrenom(StringUtils.capitalize(strings[perPrenom]));
		// Rue
		adresse.setNomDeRue(strings[per_ADR_rue]);
		// Code postal
		adresse.setCodePostal(strings[per_ADR_cp]);
		// Ville
		adresse.setVille(strings[per_ADR_ville].toUpperCase());
		// Telephone domicile
		adresse.setTelDomicile(strings[per_ADR_telDom]);
		// Telephone portable
		adresse.setTelPortable(strings[per_ADR_telPort]);
		// DateDeNaissance
		if (StringUtils.isNotEmpty(strings[perDateNaissance])){
			cliente.setDateDeNaissance(sdf.parse(strings[perDateNaissance]));
		}
		// eMail
		adresse.setEmail(strings[per_ADR_email]);
		// Taille haut
		TailleHaut tailleHaut = extractTailleHaut(strings[perTailleHaut]);
		cliente.setTailleHaut(tailleHaut);
		// Taille bas
		TailleBas tailleBas = extractTailleBas(strings[perTailleBas]);
		cliente.setTailleBas(tailleBas);
		// Derniere visiste
		if (StringUtils.isNotEmpty(strings[perDerniereVisite])){
			cliente.setDerniereVisite(sdf.parse(strings[perDerniereVisite]));
		}
		// Commentaires
		cliente.setCommentaires(strings[perCommentaires]);
		// Preferences
		cliente.setPreferences(strings[perPreferences]);
		// Achats
		cliente.setAchats(strings[perAchats]);
		//Produits
		produits = strings[perProduits];
		// Individuelle
		boolean individuelle = StringUtils.isEmpty(strings[cliIndividuelle].trim()) ? false : true;
		cliente.setIndividuelle(individuelle);
		// Hotesse
		hotesse = strings[cliHotesse];
		
		return cliente;
	}
	
	public static HotesseDTO readLineHotesse(String line) throws ParseException {
		//Supresion des quotes
		line = line.replaceAll("\"","" );
		//Split de la ligne
		String[] strings = line.split(";", -1);
		//Suppression des espaces en debut et fin de chaines
		strings = trim(strings);
		
		AdresseDTO adresse = new AdresseDTO();
		HotesseDTO hotesse = new HotesseDTO(adresse);

		// Nom
		hotesse.setNom(strings[perNom].toUpperCase());
		// Prenom
		hotesse.setPrenom(StringUtils.capitalize(strings[perPrenom]));
		// Rue
		adresse.setNomDeRue(strings[per_ADR_rue]);
		// Code postal
		adresse.setCodePostal(strings[per_ADR_cp]);
		// Ville
		adresse.setVille(strings[per_ADR_ville]);
		// Telephone domicile
		adresse.setTelDomicile(strings[per_ADR_telDom]);
		// Telephone portable
		adresse.setTelPortable(strings[per_ADR_telPort]);
		// DateDeNaissance
		if (StringUtils.isNotEmpty(strings[perDateNaissance])){
			hotesse.setDateDeNaissance(sdf.parse(strings[perDateNaissance]));
		}
		// eMail
		adresse.setEmail(strings[per_ADR_email]);
		// Taille haut
		TailleHaut tailleHaut = extractTailleHaut(strings[perTailleHaut]);
		hotesse.setTailleHaut(tailleHaut);
		// Taille bas
		TailleBas tailleBas = extractTailleBas(strings[perTailleBas]);
		hotesse.setTailleBas(tailleBas);
		// Derniere visiste
		if (StringUtils.isNotEmpty(strings[perDerniereVisite])){
			hotesse.setDerniereVisite(sdf.parse(strings[perDerniereVisite]));
		}
		// Commentaires
		hotesse.setCommentaires(strings[perCommentaires]);
		// Preferences
		hotesse.setPreferences(strings[perPreferences]);
		// Achats
		hotesse.setAchats(strings[perAchats]);
		//Produits
		produits = strings[perProduits];
		
		return hotesse;
	}
	
	public static ReunionDTO readLineReunion(String line) throws ParseException {
		//Supresion des quotes
		line = line.replaceAll("\"","" );
		//Split de la ligne
		String[] strings = line.split(";", -1);
		//Suppression des espaces en debut et fin de chaines
		strings = trim(strings);
		
		ReunionDTO reunion = new ReunionDTO();

		// Date
		if (StringUtils.isNotEmpty(strings[reuDate])){
			reunion.setDate(sdf.parse(strings[reuDate]));
		}
		
		// Hotesse
		hotesse = strings[reuHotesse];
		// chiffre d'affaire
		reunion.setChiffreAffaire(Double.parseDouble(strings[reuCA]));
		
		return reunion;
	}
	
	public static CategorieDTO readLineCategorie(String line) throws ParseException {
		//Supresion des quotes
		line = line.replaceAll("\"","" );
		//Split de la ligne
		String[] strings = line.split(";", -1);
		//Suppression des espaces en debut et fin de chaines
		strings = trim(strings);
		
		CategorieDTO categorie = new CategorieDTO();

		// Nom
		categorie.setNom(strings[categNom]);
		
		return categorie;
	}
	
	public static ProduitDTO readLineProduit(String line) throws ParseException {
		//Supresion des quotes
		line = line.replaceAll("\"","" );
		//Split de la ligne
		String[] strings = line.split(";", -1);
		//Suppression des espaces en debut et fin de chaines
		strings = trim(strings);
		
		ProduitDTO produit = new ProduitDTO();

		// Nom
		produit.setNom(strings[proNom]);
		// Reference
		produit.setReference(strings[proReference]);
		// Categorie
		categorie = strings[proCategorie];
		// Prix
		produit.setPrix(Double.parseDouble(strings[proPrix]));
		// Taille : TODO
			
		// Collection
		Collection collection = extractCollection(strings[proCollection]);
		produit.setCollection(collection);
		//Saison
		saison = Integer.parseInt(strings[proSaison]); 
		
		return produit;
	}
	
	private static TailleHaut extractTailleHaut(String extractedString) {
		TailleHaut taille = TailleHaut.ND;

		extractedString = extractedString.trim();

		if ("T80A".equalsIgnoreCase(extractedString)) taille = TailleHaut.T80A;
		else if ("T85A".equalsIgnoreCase(extractedString)) taille = TailleHaut.T85A;
		else if ("T80B".equalsIgnoreCase(extractedString)) taille = TailleHaut.T80B;
		else if ("T85B".equalsIgnoreCase(extractedString)) taille = TailleHaut.T85B;
		else if ("T90B".equalsIgnoreCase(extractedString)) taille = TailleHaut.T90B;
		else if ("T95B".equalsIgnoreCase(extractedString)) taille = TailleHaut.T95B;
		else if ("T85C".equalsIgnoreCase(extractedString)) taille = TailleHaut.T85C;
		else if ("T90C".equalsIgnoreCase(extractedString)) taille = TailleHaut.T90C;
		else if ("T95C".equalsIgnoreCase(extractedString)) taille = TailleHaut.T95C;
		else if ("T100C".equalsIgnoreCase(extractedString)) taille = TailleHaut.T100C;
		else if ("T85D".equalsIgnoreCase(extractedString)) taille = TailleHaut.T85D;
		else if ("T90D".equalsIgnoreCase(extractedString)) taille = TailleHaut.T90D;
		else if ("T95D".equalsIgnoreCase(extractedString)) taille = TailleHaut.T95D;

		return taille;
	}
	
	private static TailleBas extractTailleBas(String extractedString) {
		TailleBas taille = TailleBas.ND;

		extractedString = extractedString.trim();

		if ("T1".equalsIgnoreCase(extractedString)) taille = TailleBas.T1;
		else if ("T2".equalsIgnoreCase(extractedString)) taille = TailleBas.T2;
		else if ("T3".equalsIgnoreCase(extractedString)) taille = TailleBas.T3;
		else if ("T4".equalsIgnoreCase(extractedString)) taille = TailleBas.T4;
		else if ("T5".equalsIgnoreCase(extractedString)) taille = TailleBas.T5;

		return taille;
	}
	
	private static Collection extractCollection(String extractedString){
		Collection collection = Collection.ND;
		extractedString = extractedString.trim();
		
		if ("Attitude".equalsIgnoreCase(extractedString)) collection = Collection.Attitude;
		else if ("EXTREME".equalsIgnoreCase(extractedString)) collection = Collection.Extreme;
		else if ("Extreme Bain".equalsIgnoreCase(extractedString)) collection = Collection.ExtremeBain;
		else if ("Homme".equalsIgnoreCase(extractedString)) collection = Collection.Homme;
		
		return collection;
	}

	public static String getHotesse() {
		return hotesse;
	}
	
	public static int getSaison() {
		return saison;
	}
	
	public static String getProduits() {
		return produits;
	}
	
	public static String getCategorie(){
		return categorie;
	}
	
	/** 
	 * This String utility or util method can be used to 
	 * trim all the String values in the string array. 
	 * For input {" a1 ", "b1 ", " c1"} 
	 * the output will be {"a1", "b1", "c1"} 
	 * Method takes care of null values. 
	 * @param values 
	 * @return 
	 */
	public static String[] trim(final String[] values) {  
		for (int i = 0, length = values.length; i < length; i++) {  
			if (values[i] != null) {  
				values[i] = values[i].trim();                                  
			}  
		}  
		return values;  
	}
}
